#include "productdelegate.h"
#include <QPainter>
#include <QStyle>
#include <QModelIndex>
#include <QAbstractItemModel>
#include <QMouseEvent>
#include <QApplication>
#include <QEvent>
#include <QDoubleSpinBox>
#include <QCheckBox>
#include <QComboBox>

// 构造函数：初始化父类QStyledItemDelegate
ProductDelegate::ProductDelegate(QObject *parent)
    : QStyledItemDelegate(parent)
{
}

// 重写绘制函数：自定义单元格显示样式
void ProductDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option,
                           const QModelIndex &index) const
{
    // 对会员折扣列特殊处理：以复选框样式显示
    if (isDiscountColumn(index.column())) {
        bool isAllowed = index.data(Qt::EditRole).toBool(); // 使用EditRole获取数据

        // 确保选项状态正确
        QStyleOptionViewItem opt = option;
        initStyleOption(&opt, index);

        // 绘制单元格背景
        if (opt.state & QStyle::State_Selected) {
            painter->fillRect(opt.rect, opt.palette.highlight());
        } else {
            painter->fillRect(opt.rect, opt.palette.base());
        }

        // 配置复选框样式选项
        QStyleOptionButton checkBoxOption;
        checkBoxOption.state = isAllowed ? QStyle::State_On : QStyle::State_Off;
        checkBoxOption.state |= QStyle::State_Enabled;

        // 计算复选框在单元格内的居中位置
        QRect cellRect = option.rect;
        int checkBoxSize = qMin(cellRect.width(), cellRect.height()) - 4; // 动态大小，留边距
        checkBoxSize = qMax(16, qMin(20, checkBoxSize)); // 限制在16-20像素之间

        int x = cellRect.left() + (cellRect.width() - checkBoxSize) / 2;
        int y = cellRect.top() + (cellRect.height() - checkBoxSize) / 2;
        checkBoxOption.rect = QRect(x, y, checkBoxSize, checkBoxSize);

        // 绘制复选框
        QApplication::style()->drawControl(QStyle::CE_CheckBox, &checkBoxOption, painter);
        return;
    }

    // 其他列使用默认绘制逻辑
    QStyledItemDelegate::paint(painter, option, index);
}

// 重写编辑器事件处理函数
bool ProductDelegate::editorEvent(QEvent *event, QAbstractItemModel *model,
                                 const QStyleOptionViewItem &option,
                                 const QModelIndex &index)
{
    // 处理会员折扣列的点击事件
    if (isDiscountColumn(index.column()) &&
        (event->type() == QEvent::MouseButtonRelease ||
         event->type() == QEvent::MouseButtonDblClick)) {

        QMouseEvent *mouseEvent = static_cast<QMouseEvent*>(event);

        // 计算复选框区域
        QRect cellRect = option.rect;
        int checkBoxSize = qMin(cellRect.width(), cellRect.height()) - 4;
        checkBoxSize = qMax(16, qMin(20, checkBoxSize));
        int x = cellRect.left() + (cellRect.width() - checkBoxSize) / 2;
        int y = cellRect.top() + (cellRect.height() - checkBoxSize) / 2;
        QRect checkBoxRect(x, y, checkBoxSize, checkBoxSize);

        // 检查点击是否在复选框区域内
        if (checkBoxRect.contains(mouseEvent->pos())) {
            // 切换复选框状态
            bool currentValue = index.data(Qt::EditRole).toBool();
            return model->setData(index, !currentValue, Qt::EditRole);
        }

        return false; // 点击在复选框区域外，不处理
    }

    // 其他事件交给基类处理
    return QStyledItemDelegate::editorEvent(event, model, option, index);
}

// 重写创建编辑器函数：根据列类型返回对应编辑器
QWidget *ProductDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option,
                                      const QModelIndex &index) const
{
    Q_UNUSED(option);

    // 价格列（进货价/售价）：使用带人民币符号的双精度SpinBox
    if (isPriceColumn(index.column())) {
        QDoubleSpinBox *editor = new QDoubleSpinBox(parent);
        editor->setRange(0.01, 99999.99); // 设置价格范围
        editor->setDecimals(2); // 保留两位小数
        editor->setPrefix("¥ "); // 添加货币前缀
        return editor;
    }

    // 会员折扣列：使用复选框编辑器
    if (isDiscountColumn(index.column())) {
        QCheckBox *editor = new QCheckBox(parent);
        return editor;
    }

    // 分类ID列：使用下拉框编辑器（示例分类，实际可动态加载）
    if (isCategoryColumn(index.column())) {
        QComboBox *editor = new QComboBox(parent);
        editor->addItem("食品类", 1);
        editor->addItem("日用品类", 2);
        editor->addItem("电子产品类", 3);
        editor->addItem("服装类", 4);
        editor->addItem("其他类", 5);
        return editor;
    }

    // 其他列使用默认文本编辑器
    return QStyledItemDelegate::createEditor(parent, option, index);
}

// 重写设置编辑器数据函数：将模型数据加载到编辑器
void ProductDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
{
    QVariant value = index.model()->data(index, Qt::EditRole); // 获取模型中的编辑数据

    // 价格列：设置SpinBox值
    if (isPriceColumn(index.column())) {
        QDoubleSpinBox *spinBox = static_cast<QDoubleSpinBox*>(editor);
        spinBox->setValue(value.toDouble());
        return;
    }

    // 会员折扣列：设置CheckBox状态
    if (isDiscountColumn(index.column())) {
        QCheckBox *checkBox = static_cast<QCheckBox*>(editor);
        checkBox->setChecked(value.toBool());
        return;
    }

    // 分类ID列：设置ComboBox选中项
    if (isCategoryColumn(index.column())) {
        QComboBox *comboBox = static_cast<QComboBox*>(editor);
        int idx = comboBox->findData(value.toInt()); // 根据数据查找索引
        if (idx >= 0) {
            comboBox->setCurrentIndex(idx);
        }
        return;
    }

    // 其他列使用默认逻辑
    QStyledItemDelegate::setEditorData(editor, index);
}

// 重写设置模型数据函数：将编辑器数据保存到模型
void ProductDelegate::setModelData(QWidget *editor, QAbstractItemModel *model,
                                  const QModelIndex &index) const
{
    // 价格列：从SpinBox获取值
    if (isPriceColumn(index.column())) {
        QDoubleSpinBox *spinBox = static_cast<QDoubleSpinBox*>(editor);
        double value = spinBox->value();
        model->setData(index, value, Qt::EditRole);
        return;
    }

    // 会员折扣列：从CheckBox获取状态
    if (isDiscountColumn(index.column())) {
        QCheckBox *checkBox = static_cast<QCheckBox*>(editor);
        bool value = checkBox->isChecked();
        model->setData(index, value, Qt::EditRole);
        return;
    }

    // 分类ID列：从ComboBox获取当前数据
    if (isCategoryColumn(index.column())) {
        QComboBox *comboBox = static_cast<QComboBox*>(editor);
        int value = comboBox->currentData().toInt(); // 获取当前项关联的数据
        model->setData(index, value, Qt::EditRole);
        return;
    }

    // 其他列使用默认逻辑
    QStyledItemDelegate::setModelData(editor, model, index);
}

// 重写更新编辑器几何函数：设置编辑器位置和大小
void ProductDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option,
                                          const QModelIndex &index) const
{
    // 对于复选框列，确保编辑器覆盖整个单元格
    if (isDiscountColumn(index.column())) {
        editor->setGeometry(option.rect);
    } else {
        // 其他列使用默认逻辑
        QStyledItemDelegate::updateEditorGeometry(editor, option, index);
    }
}

// 判断是否为价格列（进货价或售价）
bool ProductDelegate::isPriceColumn(int column) const
{
    return column == 5 || column == 6; // 5:进货价 6:售价
}

// 判断是否为会员折扣列
bool ProductDelegate::isDiscountColumn(int column) const
{
    return column == 8; // 8:会员折扣
}

// 判断是否为分类ID列
bool ProductDelegate::isCategoryColumn(int column) const
{
    return column == 7; // 7:分类ID
}
